home *** CD-ROM | disk | FTP | other *** search
/ CD Actual 9 / CDACTUAL9.iso / share / Dos / VARIOS / pascal / DELPHI.SWG / 0006_Set printer options in DELPHI.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1996-02-21  |  20.9 KB  |  651 lines

  1. unit EDSPrint;
  2.   {unit to programmatically set printer options so that user does not}
  3.   {have to go to the Printer Options Dialog Box}
  4.   {Revision 2.1}
  5. interface
  6. uses
  7.   Classes, Graphics, Forms, Printers, SysUtils, Print, WinProcs, WinTypes, Messages;
  8.             {see the WinTypes unit for constant declarations such as}
  9.             {dmPaper_Letter, dmbin_Upper, etc}
  10.  
  11. const
  12.   CCHBinName  = 24;  {Size of bin name (should have been in PRINT.PAS}
  13.   CBinMax     = 256; {Maximum number of bin sources}
  14.   CPaperNames = 256; {Maximum number of paper sizes}
  15. type
  16.   TPrintSet = class (TComponent)
  17.   private
  18.     { Private declarations }
  19.     FDevice:     PChar;
  20.     FDriver:     PChar;
  21.     FPort:       PChar;
  22.     FHandle:     THandle;
  23.     FDeviceMode: PDevMode;
  24.     FPrinter:    integer;   {same as Printer.PrinterIndex}
  25.     procedure    CheckPrinter;
  26.       {-checks to see if the printer has changed and calls SetDeviceMode if it has}
  27.   protected
  28.     { Protected declarations }
  29.     procedure   SetOrientation (Orientation: integer);
  30.     function    GetOrientation: integer;
  31.       {-sets/gets the paper orientation}
  32.     procedure   SetPaperSize (Size: integer);
  33.     function    GetPaperSize: integer;
  34.       {-sets/gets the paper size}
  35.     procedure   SetPaperLength (Length: integer);
  36.     function    GetPaperLength: integer;
  37.       {-sets/gets the paper length}
  38.     procedure   SetPaperWidth (Width: integer);
  39.     function    GetPaperWidth: integer;
  40.       {-sets/gets the paper width}
  41.     procedure   SetScale (Scale: integer);
  42.     function    GetScale: integer;
  43.       {-sets/gets the printer scale (whatever that is)}
  44.     procedure   SetCopies (Copies: integer);
  45.     function    GetCopies: integer;
  46.       {-sets/gets the number of copies}
  47.     procedure   SetBin (Bin: integer);
  48.     function    GetBin: integer;
  49.       {-sets/gets the paper bin}
  50.     procedure   SetPrintQuality (Quality: integer);
  51.     function    GetPrintQuality: integer;
  52.       {-sets/gets the print quality}
  53.     procedure   SetColor (Color: integer);
  54.     function    GetColor: integer;
  55.       {-sets/gets the color (monochrome or color)}
  56.     procedure   SetDuplex (Duplex: integer);
  57.     function    GetDuplex: integer;
  58.       {-sets/gets the duplex setting}
  59.     procedure   SetYResolution (YRes: integer);
  60.     function    GetYResolution: integer;
  61.       {-sets/gets the y-resolution of the printer}
  62.     procedure   SetTTOption (Option: integer);
  63.     function    GetTTOption: integer;
  64.       {-sets/gets the TrueType option}
  65.   public
  66.     { Public declarations }
  67.     constructor Create (AOwner: TComponent); override;
  68.       {-initializes object}
  69.     destructor  Destroy;  override;
  70.       {-destroys class}
  71.     function    GetBinSourceList: TStringList;
  72.       {-returns the current list of bins}
  73.     function    GetPaperList: TStringList;
  74.       {-returns the current list of paper sizes}
  75.     procedure   SetDeviceMode;
  76.       {-sets the internal pointer to the printers TDevMode structure}
  77.     procedure   UpdateDeviceMode;
  78.       {-updates the printers TDevMode structure}
  79.     procedure   SaveToDefaults;
  80.       {-updates the default settings for the current printer}
  81.     procedure   SavePrinterAsDefault;
  82.       {-saves the current printer as the Window's default}
  83.     function    GetPrinterName: string;
  84.       {-returns the name of the current printer}
  85.     function    GetPrinterPort: string;
  86.       {-returns the port of the current printer}
  87.     function    GetPrinterDriver: string;
  88.       {-returns the printer driver name of the current printer}
  89.  
  90.     { Property declarations }
  91.     property Orientation: integer     read   GetOrientation
  92.                                       write  SetOrientation;
  93.     property PaperSize: integer       read   GetPaperSize
  94.                                       write  SetPaperSize;
  95.     property PaperLength: integer     read   GetPaperLength
  96.                                       write  SetPaperLength;
  97.     property PaperWidth: integer      read   GetPaperWidth
  98.                                       write  SetPaperWidth;
  99.     property Scale: integer           read   GetScale
  100.                                       write  SetScale;
  101.     property Copies: integer          read   GetCopies
  102.                                       write  SetCopies;
  103.     property DefaultSource: integer   read   GetBin
  104.                                       write  SetBin;
  105.     property PrintQuality: integer    read   GetPrintQuality
  106.                                       write  SetPrintQuality;
  107.     property Color: integer           read   GetColor
  108.                                       write  SetColor;
  109.     property Duplex: integer          read   GetDuplex
  110.                                       write  SetDuplex;
  111.     property YResolution: integer     read   GetYResolution
  112.                                       write  SetYResolution;
  113.     property TTOption: integer        read   GetTTOption
  114.                                       write  SetTTOption;
  115.     property PrinterName: String      read   GetPrinterName;
  116.     property PrinterPort: String      read   GetPrinterPort;
  117.     property PrinterDriver: String    read   GetPrinterDriver;
  118.   end;  { TPrintSet }
  119.  
  120. procedure CanvasTextOutAngle (OutputCanvas: TCanvas; X,Y: integer;
  121.                               Angle: Word; St: string);
  122.   {-prints text at the desired angle}
  123.   {-current font must be TrueType!}
  124. procedure SetPixelsPerInch;
  125.   {-insures that PixelsPerInch is set so that text print at the desired size}
  126. function GetResolution: TPoint;
  127.   {-returns the resolution of the printer}
  128.  
  129. procedure Register;
  130.   {-registers the printset component}
  131.  
  132. implementation
  133.  
  134. constructor TPrintSet.Create (AOwner: TComponent);
  135.   {-initializes object}
  136. begin
  137.   inherited Create (AOwner);
  138.   if not (csDesigning in ComponentState) then
  139.   begin
  140.     GetMem (FDevice, 255);
  141.     GetMem (FDriver, 255);
  142.     GetMem (FPort, 255);
  143.     {SetDeviceMode;}
  144.     FPrinter := -99;
  145.   end {:} else
  146.   begin
  147.     FDevice := nil;
  148.     FDriver := nil;
  149.     FPort   := nil;
  150.   end;  { if... }
  151. end;  { TPrintSet.Create }
  152.  
  153. procedure TPrintSet.CheckPrinter;
  154.   {-checks to see if the printer has changed and calls SetDeviceMode if it has}
  155. begin
  156.   if FPrinter <> Printer.PrinterIndex then
  157.     SetDeviceMode;
  158. end;  { TPrintSet.CheckPrinter }
  159.  
  160. function TPrintSet.GetBinSourceList: TStringList;
  161.   {-returns the current list of bins (returns nil for none)}
  162. type
  163.   TcchBinName = array[0..CCHBinName-1] of Char;
  164.   TBinArray   = array[1..cBinMax] of TcchBinName;
  165.   PBinArray   = ^TBinArray;
  166. var
  167.   NumBinsReq:   Longint;      {number of bins required}
  168.   NumBinsRec:   Longint;      {number of bins received}
  169.   BinArray:     PBinArray;
  170.   BinList:      TStringList;
  171.   BinStr:       String;
  172.   i:            Longint;
  173.   DevCaps:      TFarProc;
  174.   DrvHandle:    THandle;
  175.   DriverName:   String;
  176. begin
  177.   CheckPrinter;
  178.   Result   := nil;
  179.   BinArray := nil;
  180.   try
  181.     DrvHandle := LoadLibrary (FDriver);
  182.     if DrvHandle <> 0 then
  183.     begin
  184.       DevCaps := GetProcAddress (DrvHandle, 'DeviceCapabilities');
  185.       if DevCaps<>nil then
  186.       begin
  187.         NumBinsReq := TDeviceCapabilities (DevCaps)(FDevice, FPort, DC_BinNames,
  188.                                                     nil, FDeviceMode^);
  189.         GetMem (BinArray, NumBinsReq * SizeOf (TcchBinName));
  190.         NumBinsRec := TDeviceCapabilities (DevCaps)(FDevice, FPort, DC_BinNames,
  191.                                                     PChar (BinArray), FDeviceMode^);
  192.         if NumBinsRec <> NumBinsReq then
  193.         begin
  194.           {raise an exception}
  195.           Raise EPrinter.Create ('Error retrieving Bin Source Info');
  196.         end;  { if... }
  197.         {now convert to TStringList}
  198.         BinList := TStringList.Create;
  199.         for i := 1 to NumBinsRec do
  200.         begin
  201.           BinStr := StrPas (BinArray^[i]);
  202.           BinList.Add (BinStr);
  203.         end;  { next i }
  204.       end;  { if... }
  205.       FreeLibrary (DrvHandle);
  206.       Result := BinList;
  207.     end {:} else
  208.     begin
  209.       {raise an exception}
  210.       DriverName := StrPas (FDriver);
  211.       Raise EPrinter.Create ('Error loading driver '+DriverName);
  212.     end;  { else }
  213.   finally
  214.     if BinArray <> nil then
  215.       FreeMem (BinArray, NumBinsReq * SizeOf (TcchBinName));
  216.   end;  { try }
  217. end;  { TPrintSet.GetBinSourceList }
  218.  
  219. function TPrintSet.GetPaperList: TStringList;
  220.   {-returns the current list of paper sizes (returns nil for none)}
  221. type
  222.   TcchPaperName = array[0..CCHPaperName-1] of Char;
  223.   TPaperArray   = array[1..cPaperNames] of TcchPaperName;
  224.   PPaperArray   = ^TPaperArray;
  225. var
  226.   NumPaperReq:   Longint;      {number of paper types required}
  227.   NumPaperRec:   Longint;      {number of paper types received}
  228.   PaperArray:    PPaperArray;
  229.   PaperList:     TStringList;
  230.   PaperStr:      String;
  231.   i:             Longint;
  232.   DevCaps:       TFarProc;
  233.   DrvHandle:     THandle;
  234.   DriverName:    String;
  235. begin
  236.   CheckPrinter;
  237.   Result     := nil;
  238.   PaperArray := nil;
  239.   try
  240.     DrvHandle := LoadLibrary (FDriver);
  241.     if DrvHandle <> 0 then
  242.     begin
  243.       DevCaps := GetProcAddress (DrvHandle, 'DeviceCapabilities');
  244.       if DevCaps<>nil then
  245.       begin
  246.         NumPaperReq := TDeviceCapabilities (DevCaps)(FDevice, FPort, DC_PaperNames,
  247.                                                      nil, FDeviceMode^);
  248.         GetMem (PaperArray, NumPaperReq * SizeOf (TcchPaperName));
  249.         NumPaperRec := TDeviceCapabilities (DevCaps)(FDevice, FPort, DC_PaperNames,
  250.                                                      PChar (PaperArray), FDeviceMode^);
  251.         if NumPaperRec <> NumPaperReq then
  252.         begin
  253.           {raise an exception}
  254.           Raise EPrinter.Create ('Error retrieving Paper Info');
  255.         end;  { if... }
  256.         {now convert to TStringList}
  257.         PaperList := TStringList.Create;
  258.         for i := 1 to NumPaperRec do
  259.         begin
  260.           PaperStr := StrPas (PaperArray^[i]);
  261.           PaperList.Add (PaperStr);
  262.         end;  { next i }
  263.       end;  { if... }
  264.       FreeLibrary (DrvHandle);
  265.       Result := PaperList;
  266.     end {:} else
  267.     begin
  268.       {raise an exception}
  269.       DriverName := StrPas (FDriver);
  270.       Raise EPrinter.Create ('Error loading driver '+DriverName);
  271.     end;  { else }
  272.   finally
  273.     if PaperArray <> nil then
  274.       FreeMem (PaperArray, NumPaperReq * SizeOf (TcchPaperName));
  275.   end;  { try }
  276. end;  { TPrintSet.GetPaperList }
  277.  
  278. procedure TPrintSet.SetDeviceMode;
  279. begin
  280.   Printer.GetPrinter (FDevice, FDriver, FPort, FHandle);
  281.   if FHandle = 0 then
  282.   begin  {driver not loaded}
  283.     Printer.PrinterIndex := Printer.PrinterIndex;
  284.       {-forces Printer object to load driver}
  285.   end;  { if... }
  286.   Printer.GetPrinter (FDevice, FDriver, FPort, FHandle);
  287.   if FHandle<>0 then
  288.   begin
  289.     FDeviceMode := Ptr (FHandle, 0);
  290.       {-PDeviceMode now points to Printer.DeviceMode}
  291.     FDeviceMode^.dmFields := 0;
  292.   end {:} else
  293.   begin
  294.     FDeviceMode := nil;
  295.     Raise EPrinter.Create ('Error retrieving DeviceMode');
  296.   end;  { if... }
  297.   FPrinter := Printer.PrinterIndex;
  298. end;  { TPrintSet.SetDeviceMode }
  299.  
  300. procedure TPrintSet.UpdateDeviceMode;
  301.   {-updates the loaded TDevMode structure}
  302. var
  303.   DrvHandle:   THandle;
  304.   ExtDevCaps:  TFarProc;
  305.   DriverName:  String;
  306.   ExtDevCode:  Integer;
  307.   OutDevMode:  PDevMode;
  308. begin
  309.   CheckPrinter;
  310.   DrvHandle := LoadLibrary (FDriver);
  311.   if DrvHandle <> 0 then
  312.   begin
  313.     ExtDevCaps := GetProcAddress (DrvHandle, 'ExtDeviceMode');
  314.     if ExtDevCaps<>nil then
  315.     begin
  316.       ExtDevCode := TExtDeviceMode (ExtDevCaps)
  317.         (0, DrvHandle, FDeviceMode^, FDevice, FPort,
  318.          FDeviceMode^, nil, DM_IN_BUFFER or DM_OUT_BUFFER);
  319.       if ExtDevCode <> IDOK then
  320.       begin
  321.         {raise an exception}
  322.         raise EPrinter.Create ('Error updating printer driver.');
  323.       end;  { if... }
  324.     end;  { if... }
  325.     FreeLibrary (DrvHandle);
  326.   end {:} else
  327.   begin
  328.     {raise an exception}
  329.     DriverName := StrPas (FDriver);
  330.     Raise EPrinter.Create ('Error loading driver '+DriverName);
  331.   end;  { else }
  332. end;  { TPrintSet.UpdateDeviceMode }
  333.  
  334. procedure TPrintSet.SaveToDefaults;
  335.   {-updates the default settings for the current printer}
  336. var
  337.   DrvHandle:   THandle;
  338.   ExtDevCaps:  TFarProc;
  339.   DriverName:  String;
  340.   ExtDevCode:  Integer;
  341.   OutDevMode:  PDevMode;
  342. begin
  343.   CheckPrinter;
  344.   DrvHandle := LoadLibrary (FDriver);
  345.   if DrvHandle <> 0 then
  346.   begin
  347.     ExtDevCaps := GetProcAddress (DrvHandle, 'ExtDeviceMode');
  348.     if ExtDevCaps<>nil then
  349.     begin
  350.       ExtDevCode := TExtDeviceMode (ExtDevCaps)
  351.         (0, DrvHandle, FDeviceMode^, FDevice, FPort,
  352.          FDeviceMode^, nil, DM_IN_BUFFER OR DM_UPDATE);
  353.       if ExtDevCode <> IDOK then
  354.       begin
  355.         {raise an exception}
  356.         raise EPrinter.Create ('Error updating printer driver.');
  357.       end {:} else
  358.         SendMessage ($FFFF, WM_WININICHANGE, 0, 0);
  359.     end;  { if... }
  360.     FreeLibrary (DrvHandle);
  361.   end {:} else
  362.   begin
  363.     {raise an exception}
  364.     DriverName := StrPas (FDriver);
  365.     Raise EPrinter.Create ('Error loading driver '+DriverName);
  366.   end;  { else }
  367. end;  { TPrintSet.SaveToDefaults }
  368.  
  369. procedure TPrintSet.SavePrinterAsDefault;
  370.   {-saves the current printer as the Window's default}
  371. var
  372.   DeviceStr: String;
  373. begin
  374.   CheckPrinter;  {make sure new printer is loaded}
  375.   {set the new device setting in the WIN.INI file}
  376.   DeviceStr := StrPas (FDevice) + ',' + StrPas (FDriver) + ',' + StrPas (FPort) + #0;
  377.   WriteProfileString ('windows', 'device', @DeviceStr[1]);
  378.   {force write to WIN.INI}
  379.   WriteProfileString (nil, nil, nil);
  380.   {broadcast to everyone that WIN.INI changed}
  381.   SendMessage ($FFFF, WM_WININICHANGE, 0, 0);
  382. end;  { TPrintSet.SavePrinterAsDefault }
  383.  
  384. procedure TPrintSet.SetOrientation (Orientation: integer);
  385.   {-sets the paper orientation}
  386. begin
  387.   CheckPrinter;
  388.   FDeviceMode^.dmOrientation := Orientation;
  389.   FDeviceMode^.dmFields := FDeviceMode^.dmFields or DM_ORIENTATION;
  390. end;  { TPrintSet.SetOrientation }
  391.  
  392. function TPrintSet.GetOrientation: integer;
  393.   {-gets the paper orientation}
  394. begin
  395.   CheckPrinter;
  396.   Result := FDeviceMode^.dmOrientation;
  397. end;  { TPrintSet.GetOrientation }
  398.  
  399. procedure TPrintSet.SetPaperSize (Size: integer);
  400.   {-sets the paper size}
  401. begin
  402.   CheckPrinter;
  403.   FDeviceMode^.dmPaperSize := Size;
  404.   FDeviceMode^.dmFields := FDeviceMode^.dmFields or DM_PAPERSIZE;
  405. end;  { TPrintSet.SetPaperSize }
  406.  
  407. function TPrintSet.GetPaperSize: integer;
  408.   {-gets the paper size}
  409. begin
  410.   CheckPrinter;
  411.   Result := FDeviceMode^.dmPaperSize;
  412. end;  { TPrintSet.GetPaperSize }
  413.  
  414. procedure TPrintSet.SetPaperLength (Length: integer);
  415.   {-sets the paper length}
  416. begin
  417.   CheckPrinter;
  418.   FDeviceMode^.dmPaperLength := Length;
  419.   FDeviceMode^.dmFields := FDeviceMode^.dmFields or DM_PAPERLENGTH;
  420. end;  { TPrintSet.SetPaperLength }
  421.  
  422. function TPrintSet.GetPaperLength: integer;
  423.   {-gets the paper length}
  424. begin
  425.   CheckPrinter;
  426.   Result := FDeviceMode^.dmPaperLength;
  427. end;  { TPrintSet.GetPaperLength }
  428.  
  429. procedure TPrintSet.SetPaperWidth (Width: integer);
  430.   {-sets the paper width}
  431. begin
  432.   CheckPrinter;
  433.   FDeviceMode^.dmPaperWidth := Width;
  434.   FDeviceMode^.dmFields := FDeviceMode^.dmFields or DM_PAPERWIDTH;
  435. end;  { TPrintSet.SetPaperWidth }
  436.  
  437. function TPrintSet.GetPaperWidth: integer;
  438.   {-gets the paper width}
  439. begin
  440.   CheckPrinter;
  441.   Result := FDeviceMode^.dmPaperWidth;
  442. end;  { TPrintSet.GetPaperWidth }
  443.  
  444. procedure TPrintSet.SetScale (Scale: integer);
  445.   {-sets the printer scale (whatever that is)}
  446. begin
  447.   CheckPrinter;
  448.   FDeviceMode^.dmScale := Scale;
  449.   FDeviceMode^.dmFields := FDeviceMode^.dmFields or DM_SCALE;
  450. end;  { TPrintSet.SetScale }
  451.  
  452. function TPrintSet.GetScale: integer;
  453.   {-gets the printer scale}
  454. begin
  455.   CheckPrinter;
  456.   Result := FDeviceMode^.dmScale;
  457. end;  { TPrintSet.GetScale }
  458.  
  459. procedure TPrintSet.SetCopies (Copies: integer);
  460.   {-sets the number of copies}
  461. begin
  462.   CheckPrinter;
  463.   FDeviceMode^.dmCopies := Copies;
  464.   FDeviceMode^.dmFields := FDeviceMode^.dmFields or DM_COPIES;
  465. end;  { TPrintSet.SetCopies }
  466.  
  467. function TPrintSet.GetCopies: integer;
  468.   {-gets the number of copies}
  469. begin
  470.   CheckPrinter;
  471.   Result := FDeviceMode^.dmCopies;
  472. end;  { TPrintSet.GetCopies }
  473.  
  474. procedure TPrintSet.SetBin (Bin: integer);
  475.   {-sets the paper bin}
  476. begin
  477.   CheckPrinter;
  478.   FDeviceMode^.dmDefaultSource := Bin;
  479.   FDeviceMode^.dmFields  := FDeviceMode^.dmFields or DM_DEFAULTSOURCE;
  480. end;  { TPrintSet.SetBin }
  481.  
  482. function TPrintSet.GetBin: integer;
  483.   {-gets the paper bin}
  484. begin
  485.   CheckPrinter;
  486.   Result := FDeviceMode^.dmDefaultSource;
  487. end;  { TPrintSet.GetBin }
  488.  
  489. procedure TPrintSet.SetPrintQuality (Quality: integer);
  490.   {-sets the print quality}
  491. begin
  492.   CheckPrinter;
  493.   FDeviceMode^.dmPrintQuality := Quality;
  494.   FDeviceMode^.dmFields := FDeviceMode^.dmFields or DM_PRINTQUALITY;
  495. end;  { TPrintSet.SetPrintQuality }
  496.  
  497. function TPrintSet.GetPrintQuality: integer;
  498.   {-gets the print quality}
  499. begin
  500.   CheckPrinter;
  501.   Result := FDeviceMode^.dmPrintQuality;
  502. end;  { TPrintSet.GetPrintQuality }
  503.  
  504. procedure TPrintSet.SetColor (Color: integer);
  505.   {-sets the color (monochrome or color)}
  506. begin
  507.   CheckPrinter;
  508.   FDeviceMode^.dmColor := Color;
  509.   FDeviceMode^.dmFields := FDeviceMode^.dmFields or DM_ORIENTATION;
  510. end;  { TPrintSet.SetColor }
  511.  
  512. function TPrintSet.GetColor: integer;
  513.   {-gets the color}
  514. begin
  515.   CheckPrinter;
  516.   Result := FDeviceMode^.dmColor;
  517. end;  { TPrintSet.GetColor }
  518.  
  519. procedure TPrintSet.SetDuplex (Duplex: integer);
  520.   {-sets the duplex setting}
  521. begin
  522.   CheckPrinter;
  523.   FDeviceMode^.dmDuplex := Duplex;
  524.   FDeviceMode^.dmFields := FDeviceMode^.dmFields or DM_DUPLEX;
  525. end;  { TPrintSet.SetDuplex }
  526.  
  527. function TPrintSet.GetDuplex: integer;
  528.   {-gets the duplex setting}
  529. begin
  530.   CheckPrinter;
  531.   Result := FDeviceMode^.dmDuplex;
  532. end;  { TPrintSet.GetDuplex }
  533.  
  534. procedure TPrintSet.SetYResolution (YRes: integer);
  535.   {-sets the y-resolution of the printer}
  536. var
  537.   PrintDevMode: Print.PDevMode;
  538. begin
  539.   CheckPrinter;
  540.   PrintDevMode := @FDeviceMode^;
  541.   PrintDevMode^.dmYResolution := YRes;
  542.   FDeviceMode^.dmFields := FDeviceMode^.dmFields or DM_YRESOLUTION;
  543. end;  { TPrintSet.SetYResolution }
  544.  
  545. function  TPrintSet.GetYResolution: integer;
  546.   {-gets the y-resolution of the printer}
  547. var
  548.   PrintDevMode: Print.PDevMode;
  549. begin
  550.   CheckPrinter;
  551.   PrintDevMode := @FDeviceMode^;
  552.   Result := PrintDevMode^.dmYResolution;
  553. end;  { TPrintSet.GetYResolution }
  554.  
  555. procedure TPrintSet.SetTTOption (Option: integer);
  556.   {-sets the TrueType option}
  557. var
  558.   PrintDevMode: Print.PDevMode;
  559. begin
  560.   CheckPrinter;
  561.   PrintDevMode := @FDeviceMode^;
  562.   PrintDevMode^.dmTTOption := Option;
  563.   FDeviceMode^.dmFields := FDeviceMode^.dmFields or DM_TTOPTION;
  564. end;  { TPrintSet.SetTTOption }
  565.  
  566. function TPrintSet.GetTTOption: integer;
  567.   {-gets the TrueType option}
  568. var
  569.   PrintDevMode: Print.PDevMode;
  570. begin
  571.   CheckPrinter;
  572.   PrintDevMode := @FDeviceMode^;
  573.   Result := PrintDevMode^.dmTTOption;
  574. end;  { TPrintSet.GetTTOption }
  575.  
  576. function TPrintSet.GetPrinterName: string;
  577.   {-returns the name of the current printer}
  578. begin
  579.   CheckPrinter;
  580.   Result := StrPas (FDevice);
  581. end;  { TPrintSet.GetPrinterName }
  582.  
  583. function TPrintSet.GetPrinterPort: string;
  584.   {-returns the port of the current printer}
  585. begin
  586.   CheckPrinter;
  587.   Result := StrPas (FPort);
  588. end;  { TPrintSet.GetPrinterPort }
  589.  
  590. function TPrintSet.GetPrinterDriver: string;
  591.   {-returns the printer driver name of the current printer}
  592. begin
  593.   CheckPrinter;
  594.   Result := StrPas (FDriver);
  595. end;  { TPrintSet.GetPrinterDriver }
  596.  
  597. destructor TPrintSet.Destroy;
  598.   {-destroys class}
  599. begin
  600.   if FDevice <> nil then
  601.     FreeMem (FDevice, 255);
  602.   if FDriver <> nil then
  603.     FreeMem (FDriver, 255);
  604.   if FPort <> nil then
  605.     FreeMem (FPort, 255);
  606.   inherited Destroy;
  607. end; { TPrintSet.Destroy }
  608.  
  609. procedure CanvasTextOutAngle (OutputCanvas: TCanvas; X,Y: integer;
  610.                               Angle: Word; St: string);
  611.   {-prints text at the desired angle}
  612.   {-current font must be TrueType!}
  613. var
  614.   LogRec:        TLogFont;
  615.   NewFontHandle: HFont;
  616.   OldFontHandle: HFont;
  617. begin
  618.   GetObject (OutputCanvas.Font.Handle, SizeOf (LogRec), Addr (LogRec));
  619.   LogRec.lfEscapement := Angle;
  620.   NewFontHandle := CreateFontIndirect (LogRec);
  621.   OldFontHandle := SelectObject (OutputCanvas.Handle, NewFontHandle);
  622.   OutputCanvas.TextOut (x, y, St);
  623.   NewFontHandle := SelectObject (OutputCanvas.Handle, OldFontHandle);
  624.   DeleteObject (NewFontHandle);
  625. end; { CanvasTextOutAngle }
  626.  
  627. procedure SetPixelsPerInch;
  628.   {-insures that PixelsPerInch is set so that text print at the desired size}
  629. var
  630.   FontSize: integer;
  631. begin
  632.   FontSize := Printer.Canvas.Font.Size;
  633.   Printer.Canvas.Font.PixelsPerInch := GetDeviceCaps (Printer.Handle, LOGPIXELSY );
  634.   Printer.Canvas.Font.Size := FontSize;
  635. end;  { SetPixelsPerInch }
  636.  
  637. function GetResolution: TPoint;
  638.   {-returns the resolution of the printer}
  639. begin
  640.   Result.X := GetDeviceCaps(Printer.Handle, LogPixelsX);
  641.   Result.Y := GetDeviceCaps(Printer.Handle, LogPixelsY);
  642. end;  { GetResolution }
  643.  
  644. procedure Register;
  645.   {-registers the printset component}
  646. begin
  647.   RegisterComponents('Domain', [TPrintSet]);
  648. end;  { Register }
  649.  
  650. end.  { EDSPrint }
  651.